package com.hyt.it.ogt.kq.service.gov.service;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import com.hyt.it.ogt.kq.service.gov.model.entity.CustomArrange;
import com.hyt.it.ogt.kq.service.gov.model.param.arrange.ArrangeResultByRoomParam;
import com.hyt.it.ogt.kq.service.gov.model.vo.*;
import com.hyt.it.ogt.kq.service.gov.model.vo.arrange.ArrangeResultByRoomVO;
import com.hyt.it.ogt.kq.service.gov.model.vo.examiner.TimeRoomParamVO;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.kq.service.gov.api.ks.model.CandidateAreaVO;
import com.hyt.it.ogt.kq.service.gov.api.ks.model.NowTestNowDataVO;
import com.hyt.it.ogt.kq.service.gov.model.entity.TaskRoom;
import com.hyt.it.ogt.kq.service.gov.model.entity.Time;
import com.hyt.it.ogt.kq.service.gov.model.entity.TimeRoomCandidate;
import com.hyt.it.ogt.kq.service.gov.model.param.ArrangedEditParam;
import com.hyt.it.ogt.kq.service.gov.model.param.DataLockUpdateParam;
import com.hyt.it.ogt.kq.service.gov.model.param.ManualArrangeParam;
import com.hyt.it.ogt.kq.service.gov.model.vo.tempinterface.UnifiedAdmissionNumberParamVO;
import com.hyt.it.ogt.kq.service.gov.roomdata.model.gce.GceCandidate;
import com.hyt.it.ogt.kq.service.gov.roomdata.model.gce.GceSeat;
import com.hyt.it.ogt.kq.service.gov.roomdata.model.obt.ObtCandidate;
import com.hyt.it.ogt.kq.service.gov.roomdata.model.obt.Seat;
import com.hyt.it.ogt.kq.service.model.vo.wechat.WeChatCandidateArrangeDetailVO;
import com.hyt.it.ogt.kq.service.model.vo.wechat.WeChatCandidateArrangeVO;
import com.hyt.model.PageParam;

/**
 * <p>
 * 考生编排信息表 服务类
 * </p>
 *
 * @author huangyh
 * @since 2021-04-08
 */
public interface ITimeRoomCandidateService extends IService<TimeRoomCandidate> {

    /**
     * 考生编排
     * 
     * @param timeRoomParamList
     * @param taskId
     * @param deleteStatus,如果传值为true则清楚数据重新编排。如果是false，则会保留原有数据继续编排。
     */
    void candidateArrange(List<TimeRoomParamVO> timeRoomParamList, String taskId, boolean deleteStatus)
            throws Exception;

    /**
     * 更新考试任务数据锁
     * 
     * @param dataLockUpdateParam
     */
    void updateTaskDataLock(DataLockUpdateParam dataLockUpdateParam);

    /**
     * 获取导出编排表头数据
     * 
     * @return
     */
    List<List<String>> headArrangeCandidateList();

    /**
     * 获取导出编排数据
     * 
     * @param arrangeCandidateQueryParamVO
     * @param candidateIds
     * @return
     */
    List<List<Object>> dataArrangeCandidateList(ArrangeCandidateQueryParamVO arrangeCandidateQueryParamVO,
            String candidateIds);

    /**
     * 判断场次考生是否存在
     * 
     * @param taskId
     * @return
     */
    Boolean timeRoomCandidateExits(String taskId);

    /**
     * 预览考生准考证号
     * 
     * @param timeRoomParamVOList
     * @param taskId
     * @return
     */
    String getCandidateAdmission(List<TimeRoomParamVO> timeRoomParamVOList, String taskId);

    List<CustomArrange> getCustomArrange(String taskId);

    /**
     * 查询考生编排结果
     * 
     * @param pageParam
     * @param arrangeCandidateQueryParamVO
     * @return
     */
    Page<TimeRoomCandidateVO> getArrangeCandidate(PageParam<TimeRoomCandidateVO> pageParam,
            ArrangeCandidateQueryParamVO arrangeCandidateQueryParamVO);

    /**
     * 查询未编排的考生信息
     * 
     * @param pageParam
     * @param arrangeNoCandidateQueryParamVO
     * @return
     */
    Page<CandidateSubjectNoArrangeVO> getNoArrangeCandidatePage(PageParam<CandidateSubjectNoArrangeVO> pageParam,
            ArrangeNoCandidateQueryParamVO arrangeNoCandidateQueryParamVO);

    /**
     * 取消编排
     * 
     * @param candidateIds
     * @param taskId
     */
    void removeArrangeCandidate(String candidateIds, String taskId);

    /**
     * 导出考生编排数据
     *
     * @param arrangeCandidateQueryParamVO
     * @param candidateIds
     */
    void exportArrangeCandidate(ArrangeCandidateQueryParamVO arrangeCandidateQueryParamVO, String candidateIds);

    /**
     * 编排统计
     * 
     * @param taskId 考试任务id
     * @return 编排统计结果
     */
    ArrangeStatisticsVO arrangeStatistics(String taskId);

    /**
     * 考务包座位信息
     * 
     * @param taskId
     * @param timeRoomId
     * @return
     */
    List<Seat> getSeatList(String taskId, String timeRoomId);

    /**
     * 获取GCE考务包座位信息
     * 
     * @param taskId     考试任务id
     * @param timeRoomId 场次id
     * @return GCE考务包座位信息
     */
    List<GceSeat> getGceSeatList(String taskId, String timeRoomId);

    /**
     * 考务包考生信息
     * 
     * @param taskId
     * @param timeRoomId
     * @return
     */
    List<ObtCandidate> getCandidateList(String taskId, String timeRoomId);

    /**
     * 获取GCE考务包考生信息
     * 
     * @param taskId     考试任务id
     * @param timeRoomId 场次id
     * @return GCE考务包考生信息
     */
    List<GceCandidate> getGceCandidateList(String taskId, String timeRoomId);

    /**
     * 查询场次考生信息
     * 
     * @param taskId
     * @param candidateId
     * @return
     */
    List<TimeRoomCandidateVO> selectCandidateInfo(String taskId, String candidateId);

    /**
     * 计算编排考生数
     * 
     * @param taskId
     * @return
     */
    Integer countArrangedCandidate(String taskId);

    /**
     * 根据考试任务id获取编排信息
     * 
     * @param taskId 考试任务id
     * @return 编排信息
     */
    List<TimeRoomCandidate> listByTaskId(String taskId);

    /**
     * 导出编排结果DBF
     * 
     * @param taskId 考试任务id
     */
    String exportArrangeResultDBF(String taskId) throws Exception;

    /**
     * 删除所有编排结果
     * 
     * @param taskId 考试任务id
     */
    void deleteAllArranged(String taskId);

    /**
     * 推送单个考生编排数据到考试
     * 
     * @param taskId
     * @param candidateId
     * @param type
     */
    void pushSimpleCandidateToKs(String taskId, String candidateId, String type);

    void importTimeRoomCandidate(String taskId, MultipartFile file);

    /**
     * 推送已编排考生微信通知
     * 
     * @param taskId 考试任务id
     * @throws Exception 异常
     */
    void pushWeChatArrangedNotification(String taskId) throws Exception;

    /**
     * 获取现考现评编排数据
     * 
     * @param taskId
     * @param timeId
     * @return
     */
    NowTestNowDataVO getCandidateArrange(String taskId, String timeId);

    /**
     * 获取任务考试类型及名称
     * 
     * @param taskId
     * @return
     */
    NowTestNowDataVO getTaskExamType(String taskId);

    /**
     * 根据报名id、报名考生id获取微信考生考试安排（针对单个报名任务）
     * 
     * @param taskSignUpId      任务报名id
     * @param candidateSignUpId 考生报名id
     * @return 微信考生考试安排
     */
    List<WeChatCandidateArrangeVO> getWeChatCandidateArrangeVO(String taskSignUpId, String candidateSignUpId);

    /**
     * 根据多个报名考生id获取微信考生考试安排（针对多个报名任务）
     * 
     * @param candidateSignUpIds 考生报名id（多个用英文逗号分隔）
     * @return 微信考生考试安排
     */
    List<WeChatCandidateArrangeVO> getWeChatCandidateArrangeVO(String candidateSignUpIds);

    /**
     * 获取微信考生考试安排详情
     * 
     * @param taskSignUpId      任务报名id
     * @param timeId            批次id
     * @param candidateSignUpId 考生报名id
     * @return 微信考生考试安排详情
     */
    WeChatCandidateArrangeDetailVO getWeChatCandidateArrangeDetailVO(String taskSignUpId, String timeId,
            String candidateSignUpId);

    /**
     * 修改编排结果
     * 
     * @param arrangedEditParam 修改编排结果参数
     */
    void edit(ArrangedEditParam arrangedEditParam);

    /**
     * 统一考生准考证号
     * 
     * @param unifiedAdmissionNumberParamVO
     */
    @Transactional(rollbackFor = Exception.class)
    Integer unifiedAdmissionNumber(UnifiedAdmissionNumberParamVO unifiedAdmissionNumberParamVO);

    /**
     * 根据考试任务id、考场id获取考生编排信息
     * 
     * @param taskId 试任务id
     * @param roomId 考场id
     * @return 考生编排信息
     */
    List<TimeRoomCandidate> listByTaskRoomId(String taskId, String roomId);

    /**
     * 获取批次下绑定的考场信息
     * 
     * @param taskId 考试任务id
     * @param timeId 批次id
     * @return 批次下绑定的考场信息
     */
    List<TaskRoom> getRoomByTime(String taskId, String timeId, String deptId,
            String areaId, String searchText);

    /**
     * 根据考试任务id、批次id查询是否已编排
     * 
     * @param taskId 考试任务id
     * @param timeId 批次id
     * @return true：已编排，false：未编排
     */
    boolean hasArranged(String taskId, String timeId);

    /**
     * 根据考试任务id、考生id查询是否有已编排考生数据
     * 
     * @param taskId          考试任务id
     * @param candidateIdList 考生id
     * @return true：已编排，false：未编排
     */
    boolean hasCandidateArranged(String taskId, List<String> candidateIdList);

    /**
     * 获取科目下绑定的批次信息
     * 
     * @param taskId    考试任务id
     * @param subjectId 科目id
     * @return 科目下绑定的批次信息
     */
    List<Time> getTimeBySubject(String taskId, String subjectId);

    /**
     * 手动编排
     * 
     * @param manualArrangeParam 手动编排参数
     */
    void manualArrange(ManualArrangeParam manualArrangeParam);

    @Transactional(rollbackFor = Exception.class)
    void addOrUpdateCandidate(String taskId, MultipartFile file);

    /**
     * 根据考试任务id获取所有准考证号
     * 
     * @param taskId 考试任务id
     * @return 所有准考证号
     */
    List<String> listAdmissionNumberByTaskId(String taskId);

    /**
     * 获取考生区域数据
     * 
     * @param taskId
     * @param timeId
     * @param admissionNumber
     * @return
     */
    CandidateAreaVO getCandidateAreaVO(String taskId, String timeId, String admissionNumber);

    /**
     * 根据任务id，考试id，准考证号，获取考生编排信息
     * 
     * @param taskId       试任务id
     * @param examid       考试id
     * @param admissionNum 准考证号
     * @return 考生编排信息
     */
    TimeRoomCandidate geTimeRoomCandidateByTaskidAndAdnumber(String taskId, String examId, String admissionNum);

    /**
     * 通过任务id和准考证查询
     *
     * @param taskId
     * @param admissionNumber
     * @return
     */
    TimeRoomCandidate get(String taskId, String admissionNumber);

    /**
     * 根据timeId统计编排人数
     * @param taskId
     * @return
     */
    List<ArrangeCountVo> countCandidateByTime(String taskId);

}
